home *** CD-ROM | disk | FTP | other *** search
- package sun.font;
-
- import java.nio.ByteBuffer;
- import java.nio.CharBuffer;
- import java.nio.charset.Charset;
- import java.nio.charset.CodingErrorAction;
-
- abstract class CMap {
- static final short ShiftJISEncoding = 2;
- static final short GBKEncoding = 3;
- static final short Big5Encoding = 4;
- static final short WansungEncoding = 5;
- static final short JohabEncoding = 6;
- static final short MSUnicodeSurrogateEncoding = 10;
- static final char noSuchChar = 'ÔøΩ';
- static final int SHORTMASK = 65535;
- static final int INTMASK = -1;
- static final char[][] converterMaps = new char[7][];
- char[] xlat;
- public static final NullCMapClass theNullCmap = new NullCMapClass();
-
- static CMap initialize(TrueTypeFont var0) {
- CMap var1 = null;
- short var4 = -1;
- int var5 = 0;
- int var6 = 0;
- int var7 = 0;
- int var8 = 0;
- int var9 = 0;
- int var10 = 0;
- int var11 = 0;
- int var12 = 0;
- boolean var13 = false;
- ByteBuffer var14 = var0.getTableBuffer(1668112752);
- int var15 = var0.getTableSize(1668112752);
- short var16 = var14.getShort(2);
-
- for(int var17 = 0; var17 < var16; ++var17) {
- var14.position(var17 * 8 + 4);
- short var3 = var14.getShort();
- if (var3 == 3) {
- var13 = true;
- var4 = var14.getShort();
- int var2 = var14.getInt();
- switch (var4) {
- case 0:
- var5 = var2;
- break;
- case 1:
- var6 = var2;
- break;
- case 2:
- var7 = var2;
- break;
- case 3:
- var8 = var2;
- break;
- case 4:
- var9 = var2;
- break;
- case 5:
- var10 = var2;
- break;
- case 6:
- var11 = var2;
- case 7:
- case 8:
- case 9:
- default:
- break;
- case 10:
- var12 = var2;
- }
- }
- }
-
- if (var13) {
- if (var12 != 0) {
- var1 = createCMap(var14, var12, (char[])null);
- } else if (var5 != 0) {
- var1 = createCMap(var14, var5, (char[])null);
- } else if (var6 != 0) {
- var1 = createCMap(var14, var6, (char[])null);
- } else if (var7 != 0) {
- var1 = createCMap(var14, var7, getConverterMap((short)2));
- } else if (var8 != 0) {
- var1 = createCMap(var14, var8, getConverterMap((short)3));
- } else if (var9 != 0) {
- if (!FontManager.isSolaris || var0.platName == null || !var0.platName.startsWith("/usr/openwin/lib/locale/zh_CN.EUC/X11/fonts/TrueType") && !var0.platName.startsWith("/usr/openwin/lib/locale/zh_CN/X11/fonts/TrueType") && !var0.platName.startsWith("/usr/openwin/lib/locale/zh/X11/fonts/TrueType")) {
- var1 = createCMap(var14, var9, getConverterMap((short)4));
- } else {
- var1 = createCMap(var14, var9, getConverterMap((short)3));
- }
- } else if (var10 != 0) {
- var1 = createCMap(var14, var10, getConverterMap((short)5));
- } else if (var11 != 0) {
- var1 = createCMap(var14, var11, getConverterMap((short)6));
- }
- } else {
- var1 = createCMap(var14, var14.getInt(8), (char[])null);
- }
-
- return var1;
- }
-
- static char[] getConverter(short var0) {
- char var1 = 'ËÄÄ';
- char var2 = '\uffff';
- String var3;
- switch (var0) {
- case 2:
- var1 = 'ËÖÄ';
- var2 = 'ﳼ';
- var3 = "SJIS";
- break;
- case 3:
- var1 = 'ËÖÄ';
- var2 = 'ﺠ';
- var3 = "GBK";
- break;
- case 4:
- var1 = 'ÍÖÄ';
- var2 = '\ufefe';
- var3 = "Big5";
- break;
- case 5:
- var1 = 'ꆡ';
- var2 = 'Ôªû';
- var3 = "EUC_KR";
- break;
- case 6:
- var1 = 'ËÖÅ';
- var2 = '﷾';
- var3 = "Johab";
- break;
- default:
- return null;
- }
-
- try {
- char[] var4 = new char[65536];
-
- for(int var5 = 0; var5 < 65536; ++var5) {
- var4[var5] = 'ÔøΩ';
- }
-
- byte[] var14 = new byte[(var2 - var1 + 1) * 2];
- char[] var6 = new char[var2 - var1 + 1];
- int var7 = 0;
- if (var0 == 2) {
- for(int var9 = var1; var9 <= var2; ++var9) {
- int var8 = var9 >> 8 & 255;
- if (var8 >= 161 && var8 <= 223) {
- var14[var7++] = -1;
- var14[var7++] = -1;
- } else {
- var14[var7++] = (byte)var8;
- var14[var7++] = (byte)(var9 & 255);
- }
- }
- } else {
- for(int var18 = var1; var18 <= var2; ++var18) {
- var14[var7++] = (byte)(var18 >> 8 & 255);
- var14[var7++] = (byte)(var18 & 255);
- }
- }
-
- Charset.forName(var3).newDecoder().onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE).replaceWith("\u0000").decode(ByteBuffer.wrap(var14, 0, var14.length), CharBuffer.wrap(var6, 0, var6.length), true);
-
- for(int var19 = 32; var19 <= 126; ++var19) {
- var4[var19] = (char)var19;
- }
-
- if (var0 == 2) {
- for(int var20 = 161; var20 <= 223; ++var20) {
- var4[var20] = (char)(var20 - 161 + 'ÔΩ°');
- }
- }
-
- System.arraycopy(var6, 0, var4, var1, var6.length);
- char[] var21 = new char[65536];
-
- for(int var10 = 0; var10 < 65536; ++var10) {
- if (var4[var10] != 'ÔøΩ') {
- var21[var4[var10]] = (char)var10;
- }
- }
-
- return var21;
- } catch (Exception var11) {
- var11.printStackTrace();
- return null;
- }
- }
-
- static char[] getConverterMap(short var0) {
- if (converterMaps[var0] == null) {
- converterMaps[var0] = getConverter(var0);
- }
-
- return converterMaps[var0];
- }
-
- static CMap createCMap(ByteBuffer var0, int var1, char[] var2) {
- char var3 = var0.getChar(var1);
- long var4;
- if (var3 < '\b') {
- var4 = (long)var0.getChar(var1 + 2);
- } else {
- var4 = (long)(var0.getInt(var1 + 4) & -1);
- }
-
- if ((long)var1 + var4 > (long)var0.capacity() && FontManager.logging) {
- FontManager.logger.warning("Cmap subtable overflows buffer.");
- }
-
- switch (var3) {
- case '\u0000':
- return new CMapFormat0(var0, var1);
- case '\u0001':
- case '\u0003':
- case '\u0005':
- case '\u0007':
- case '\t':
- case '\u000b':
- default:
- throw new RuntimeException("Cmap format unimplemented: " + var0.getChar(var1));
- case '\u0002':
- return new CMapFormat2(var0, var1, var2);
- case '\u0004':
- return new CMapFormat4(var0, var1, var2);
- case '\u0006':
- return new CMapFormat6(var0, var1, var2);
- case '\b':
- return new CMapFormat8(var0, var1, var2);
- case '\n':
- return new CMapFormat10(var0, var1, var2);
- case '\f':
- return new CMapFormat12(var0, var1, var2);
- }
- }
-
- abstract char getGlyph(int var1);
-
- final int getControlCodeGlyph(int var1, boolean var2) {
- if (var1 < 16) {
- switch (var1) {
- case 9:
- case 10:
- case 13:
- return 65535;
- case 11:
- case 12:
- }
- } else if (var1 >= 8204) {
- if (var1 <= 8207 || var1 >= 8232 && var1 <= 8238 || var1 >= 8298 && var1 <= 8303) {
- return 65535;
- }
-
- if (var2 && var1 >= 65535) {
- return 0;
- }
- }
-
- return -1;
- }
- }
-